<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 经典面试题：实现add(1)(2)(3)(4) = 10;add(1)(1,2,3)(2) = 9;
      function add() {
        // 将传入的补丁参数转为数组对象
        var _args = Array.prototype.slice.call(arguments);
        // var _args = Array.from(arguments)
        // console.log(_args);
        var _adder = function () {
          _args.push(...arguments);
          return _adder;
        };
        // toString隐形转换的特性
        _adder.toString = function () {
          return _args.reduce((a, b) => {
            return a + b;
          }, 0);
        };
        return _adder;
      }
      function add2(x) {
        return function (y) {
          return x + y;
        };
      }
      // console.log(add2(3)(4));
      console.log(add(1)(2)(3)(4));
      console.log(add(1)(1, 2, 3)(2));

      //    function curry(fn,args) {
      //        var length =fn.length;
      //        var args = args || []
      //        return function() {
      //            newArgs = args.concat(Array.prototype.slice.call(arguments))
      //            if(newArgs.length < length) {
      //                return curry.call(this,fn,newArgs)
      //            }else {
      //                return fn.apply(this,newArgs)
      //            }
      //        }
      //    }
      //    function mulFn(a,b,c) {
      //        return a * b * c
      //    }
      //    var mul = curry(mulFn);
      //    console.log(mul);
      function sum(a, b) {
        return a + b;
      }
      function curry(fn, args) {
        var len = fn.length; //获取函数的参数个数
        var args = args || [];
        return function () {
          var newArgs = args.concat(Array.prototype.slice.call(arguments));
          if (newArgs.length < len) {
            return curry.call(this, fn, newArgs);
          } else {
            return fn.apply(this, newArgs);
          }
        };
      }
      const sum2 = curry(sum);
      console.log(sum2(1, 2));
      console.log(sum2(1)(2));
    </script>
  </body>
</html>
